package com.handpay.framework.utils;

import java.lang.ref.SoftReference;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import android.graphics.Bitmap;
import android.text.TextUtils;

import com.handpay.zztong.hp.log.HPLog;

/**
 * 供ImageLoader使用。不对外部开放
 * 
 * @author jmshuai
 * 
 */
class BitmapCacheUtils {
	static private BitmapCacheUtils mInstance;
	// SoftReference是软引用，是为了更好的为了系统回收变量
	// 必须要用同步。
    private Map<String, SoftReference<Bitmap>> imageCache = new ConcurrentHashMap<String, SoftReference<Bitmap>>();
	public synchronized static BitmapCacheUtils getInstance() {
		if (null == mInstance) {
			mInstance = new BitmapCacheUtils();
		}
		return mInstance;
	}
	/**
	 * 判断是否已经存在
	 * 
	 * @param key
	 * @return
	 */
	public boolean isInCache(String key) {
		return imageCache.containsKey(key);
	}
	/**
	 * 尝试获取Bitmap
	 * 
	 * @param key
	 * @return
	 */
	public Bitmap getBitmap(String key) {
		SoftReference<Bitmap> softReference = imageCache.get(key);
		if (null != softReference) {
			Bitmap b = softReference.get();
			// 如果结果为空了，需要重新存放。
			if (null == b) {
                for (String k : imageCache.keySet()) {
                    SoftReference<Bitmap> ref = imageCache.get(k);
                    if (null == ref.get()) {
                        imageCache.remove(k);
                        HPLog.i("BitmapCacheUtils", k + " miss!");
                    }
                }
                HPLog.i("BitmapCacheUtils", "size:" + imageCache.size());
			}
			return b;
		}
		return null;
	}
	/**
	 * 
	 * @param key
	 * @param b
	 * @return true 表示添加成功。
	 */
	public boolean putInCache(String key, Bitmap b) {
		if (null != b && !TextUtils.isEmpty(key) && !isInCache(key)) {
            HPLog.i("BitmapCacheUtils", "put key" + key);
			imageCache.put(key, new SoftReference<Bitmap>(b));
			return true;
		}
		return false;
	}
}
